package avl.non_recursion;

/**
 * AVL 树的 节点类
 *
 * @param <V> 节点中的元素, 需要重写 equals ，能判断非地址的相等
 */
public class Node<V extends Comparable<V>> {
    /**
     * 父节点，非递归方式的关键
     */
    private Node<V> parent;
    /**
     * 左（子）节点
     */
    private Node<V> left;
    /**
     * 右（节）点
     */
    private Node<V> right;
    /**
     * 树的高度
     */
    private int height;
    /**
     * 元素
     */
    private V element;

    public Node(V element) {
        height = 1;
        this.element = element;
    }

    /**
     * 重新计算节点的高度
     */
    public void reComputerHeight() {
        // 重新计算高度
        // TODO 为什么可以直接使用 .height 方式调用？？？
        int leftHeight = left == null ? 0 : left.height;
        int rightHeight = right == null ? 0 : right.height;
        this.height = Math.max(leftHeight, rightHeight) + 1;
    }

    /**
     * 在插入操作后，链式重新计算所有父节点的高度
     */
    public void chainedReComputerHeight() {
        reComputerHeight();
        // 链式调用父节点
        if (parent != null) {
            parent.chainedReComputerHeight();
        }
    }

    public Node<V> getParent() {
        return parent;
    }

    public void setParent(Node<V> parent) {
        this.parent = parent;
    }

    public Node<V> getLeft() {
        return left;
    }

    public void setLeft(Node<V> left) {
        this.left = left;
    }

    public Node<V> getRight() {
        return right;
    }

    public void setRight(Node<V> right) {
        this.right = right;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public V getElement() {
        return element;
    }

    public void setElement(V element) {
        this.element = element;
    }
}
